package com.lenovo.agricultureclient.ui.activity;

import java.util.ArrayList;
import java.util.Date;

import com.lenovo.agricultureclient.AppConfig;
import com.lenovo.agricultureclient.ClientApp;
import com.lenovo.agricultureclient.bean.SensorValue;
import com.lenovo.agricultureclient.db.SensorValueDB;
import com.lenovo.agricultureclient.request.BaseRequest;
import com.lenovo.agricultureclient.request.GetSensorRequest;
import com.lenovo.agricultureclient.request.RequestThread;
import com.lenovo.agricultureclient.request.BaseRequest.RequestResult;
import com.lenovo.agricultureclient.ui.dialog.LoadingDialog;
import com.nostra13.universalimageloader.core.ImageLoader;

import android.app.AlertDialog;
import android.app.DialogFragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.widget.Toast;

/**
 * 本项目的基础activity,主要包含了一个循环执行的获取传感器数据的线程，以及一起其他常用的组件
 * @author zongbingwu
 *
 */
public class AppBaseActivity extends FragmentActivity 
{
	private static final String TAG = "AppBaseActivity";
	//app对象
	protected ClientApp mApp;
	//图片异步加载对象，Android-Universal-Image-Loader是一个开源的UI组件程序，目的是提供一个可重复使用的仪器为异步图像加载，缓存和显示
	protected ImageLoader mImageLoader = ImageLoader.getInstance();
	
	/*
	 * SharedPreferences是以键值对来存储应用程序的配置信息的一种方式，
	 * 它只能存储基本数据类型。一个程序的配置文件仅可以在本应用程序中使用，
	 * 或者说只能在同一个包内使用，不能在不同的包之间使用。
	 * 实际上sharedPreferences是采用了XML格式将数据存储到设备中，
	 */
	protected SharedPreferences mSharedPreferences;
	//屏幕信息对象
	protected DisplayMetrics mDisplayMetrics = new DisplayMetrics();
	//数据加载等待框
	protected LoadingDialog mLoadDig;
	
	//请求执行线程
	protected RequestThread mGetSensorThread;
	//获取传感器实时值的请求类
	private GetSensorRequest mGetSensorRequest;
	
	private static final int LIST_MAX_NUM = 10;//传感器数据内存缓存容量，超过就保存到数据库中
	private ArrayList<SensorValue> mSensorDataList;//传感器数据内存缓存
	private SensorValueDB mSensorValueDB;//传感器值的数据库类
	
	//显示提示框
	protected void showToast(String msg) 
	{
		if(msg!=null && !msg.equals(""))
		{
			Toast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
			toast.setGravity(Gravity.CENTER, 0, 0);
			toast.show();
		}
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		
		mApp = (ClientApp)getApplication();
		
		mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
		//获取屏幕信息
		getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
		
		//循环不断获取传感器数据的线程
		mGetSensorThread = new RequestThread(AppConfig.COMMUN_TYPE, getApplicationContext(), mApp.getHandler());
		mGetSensorThread.setLoop(true, 1000);//设置1秒种获取一次传感器数据
		//获取传感器数据的请求实体
		mGetSensorRequest = new GetSensorRequest();
		mGetSensorRequest.setSensorValue(mApp.getCurSensorValue());
		mGetSensorRequest.setOnResponseEventListener(new BaseRequest.OnResponseEventListener() {
			@Override
			public void onResponse(BaseRequest request, RequestResult result) {
				//处理请求结果
				if(mGetSensorRequest.isSuccess())
				{
					//每次获取到传感器数据一行，将结果通知给其子类
					onGetSensor();
					SensorValue value = mApp.getCurSensorValue().clone();
					//将传感器数据放到缓存
					mSensorDataList.add(value);
					if(mSensorDataList.size()>LIST_MAX_NUM){
						//如果缓存已满，则保存到数据库中
						saveSensorDataToDB();
						mSensorDataList.clear();
					}
				}
			}
		});
		//请求执行线程装载请求实体
		mGetSensorThread.setRequest(mGetSensorRequest);
		
		mSensorDataList = new ArrayList<SensorValue>();
		
		mSensorValueDB = new SensorValueDB(this);
		//每次创建该界面时，先清除一天前的历史记录
		Date now = new Date();
		mSensorValueDB.deleteSensorByTime(now.getTime()-86400000);
	}
	//显示“加载等待框”
	public void showLoadDialog()
	{
		if(mLoadDig == null)
		{
			mLoadDig = new LoadingDialog();
			mLoadDig.setStyle(DialogFragment.STYLE_NO_FRAME, 0); 
		}
		mLoadDig.show(getFragmentManager(), "dialog");
	}
	
	//销毁“加载等待框”
	public void dismissLoadDialog()
	{
		if(mLoadDig != null)
		{
			mLoadDig.dismiss();
		}
	}
	
	//显示带有“确定”按钮的提示框
	public void showAlertDialog(String title, String message)
	{
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(title);
		builder.setMessage(message);
		builder.setPositiveButton(getString(android.R.string.ok), null);
		builder.show();
	}
	
	//开启一次性的请求线程，请求结束以后，线程就停止
	public RequestThread startRequest(BaseRequest request)
	{
		if(request != null)
		{
			RequestThread thread = new RequestThread(AppConfig.COMMUN_TYPE, getApplicationContext(), mApp.getHandler());
	    	thread.setRequest(request);
	    	thread.start();
	    	return thread;
		}
		return null;
	}
	
	//以下函数功能，开放给其子类使用
	//开始不断的获取传感器数据
	protected void startGetSensorData(){
		mGetSensorThread.start();
	}
	//停止线程
	protected void stopGetSensorData(){
		mGetSensorThread.stopRequestThread();
	}
	//暂停线程
	protected void pauseGetSensorData(){
		mGetSensorThread.pause();
	}
	//重新启动线程
	protected void restartGetSensorData(){
		mGetSensorThread.restart();
	}
	
	//每次获取到传感器数据一行，将结果通知给其子类
	protected void onGetSensor(){}
	
	@Override
	protected void onStart() {
		super.onStart();
		//当界面从后台进入到前台显示时，重新开启线程
		mGetSensorThread.restart();
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		//当界面退到后台时，暂停线程
		mGetSensorThread.pause();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//停止线程
		mGetSensorThread.stopRequestThread();
		if(mSensorValueDB!=null){
			//关闭数据库
			mSensorValueDB.close();
		}
	}
	
	//将缓存中的传感器数据保存到数据库中
	private void saveSensorDataToDB()
	{
		ArrayList<Object> list = new ArrayList<Object>();
		list.addAll(mSensorDataList);
		//Log.d(TAG,"save sensor data to database");
		mSensorValueDB.saveDataToDB(list, null);
	}

	public SensorValueDB getSensorValueDB() {
		return mSensorValueDB;
	}
}
